package business.global.pk.tdk;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import business.tdk.c2s.cclass.TDKSet_Pos;
import com.ddm.server.common.CommLogD;
import jsproto.c2s.cclass.pk.BasePocker;


public class TDKSetPosMgr {
    private TDKRoomSet set;

    public TDKSetPosMgr(TDKRoomSet set) {
        super();
        this.set = set;
    }

    public List<TDKSet_Pos> getAllPlayBackNotify() {
        return set.posDict.values().stream().filter(k -> null != k).map(k -> k.getNotifyPlayBack()).collect(Collectors.toList());
    }

    /**
     * 检查是否所有人弃牌
     *
     * @return
     */
    public boolean checkAllQiPai() {
        //只要有一人没棋牌就结束
        int playingCount=this.set.getRoom().getPlayingCount();
        long qipaiCount = this.set.posDict.values().stream().filter(item->item!=null&&item.getRoomPos().isPlayTheGame()&&item.isQiPai()).count();
        return playingCount-qipaiCount==1;

        /*
        TDKSetPos yPos = null;
        for (int i = 0; i < this.set.getPlayerNum(); i++) {
            yPos = this.set.posDict.get(i);
            if (null == yPos) {
                continue;
            }
            //YSJVB 没玩这个游戏不算，因为中途可以加入
            if(!yPos.getRoomPos().isPlayTheGame()){
                continue;
            }
            if (this.set.getCurOpPos() == yPos.getPosID()) {
                continue;
            }
            if (!yPos.isQiPai()) {
                return false;
            }
        }
        return true;
        */
    }

    /**
     * 获取唯一没有弃牌的玩家位置ID
     *
     * @return
     */
    public int getNotQiPaiPodID() {
        TDKSetPos yPos = null;
        List<Integer> posList = new ArrayList<>();
        for (int i = 0; i < this.set.getPlayerNum(); i++) {
            yPos = this.set.posDict.get(i);
            if (null != yPos && !yPos.isQiPai()) {
                posList.add(yPos.getPosID());
            }
        }
        if (posList.size() == 1) {
            return posList.get(0);
        } else {
            CommLogD.error("TDKSetPosMgr getNotQiPaiPodID error size:{}", posList.size());
            return -1;
        }

    }

    /**
     * 获取最大分数的位置。
     *
     * @param calcType 计算类型
     * @return
     */
    public int calcMaxPointPos(TDKdefine.TDK_CALC_TYPE calcType, boolean dai2Flag) {
        List<TDKSetPos> posList = this.set.posDict.values().stream().filter(k -> !k.isQiPai()).collect(Collectors.toList());

        // 如果所有玩家都弃牌或者不存在。
        if (posList.size() <= 0) {
            // 返回最后一个弃牌玩家。
            return this.set.getQiPaiPos();
        }
        // 获取最大值。
        Optional<TDKSetPos> max = posList.stream()
                .max((a, b) -> TDKSetPosOp.calcPosCount(a.getCardList(calcType), b.getCardList(calcType), a.getPosID(), b.getPosID(), dai2Flag) == a.getPosID() ? 1 : -1);
        return max.get().getPosID();
    }

    /**
     * 烂锅玩法 获取最大分数的位置。
     *
     * @param calcType 计算类型
     * @return
     */
    public int calcMaxPointPosValue(TDKdefine.TDK_CALC_TYPE calcType) {
        List<TDKSetPos> posList = this.set.posDict.values().stream().filter(k -> !k.isQiPai()).collect(Collectors.toList());
        int sizePos = posList.size();
        // 如果所有玩家都弃牌或者不存在。
        if (sizePos <= 0) {
            // 返回最后一个弃牌玩家。
            return this.set.getQiPaiPos();
        } else if (sizePos == 1) {
            // 如果一个玩家就一个玩家是大赢家。
            return posList.get(0).getPosID();
        }
        // 获取最大值。
        List<TDKSetPos> list = posList.stream()
                .sorted((a, b) -> TDKSetPosOp.calcPosCountValue(a.getCardList(calcType), b.getCardList(calcType),
                        a.getPosID(), b.getPosID(), set.getDai2Flag()) == b.getPosID() ? 1 : -1)
                .collect(Collectors.toList());
        TDKSetPos xPos = list.get(0);
        TDKSetPos yPos = list.get(1);
        return TDKSetPosOp.calcPosCountValue(xPos.getCardList(calcType), yPos.getCardList(calcType), xPos.getPosID(), yPos.getPosID(), set.getDai2Flag());
    }


    /**
     * 计算不比花色最大分数位置
     *
     * @param calcType 计算类型
     * @return
     */
    public int calcNotHuaMaxPointPos(TDKdefine.TDK_CALC_TYPE calcType) {
        List<TDKSetPos> posList = this.set.posDict.values().stream().filter(k -> !k.isQiPai()).collect(Collectors.toList());
        int sizePos = posList.size();
        // 如果所有玩家都弃牌或者不存在。
        if (sizePos <= 0) {
            // 返回最后一个弃牌玩家。
            return this.set.getQiPaiPos();
        } else if (sizePos == 1) {
            // 如果一个玩家就一个玩家是大赢家。
            return posList.get(0).getPosID();
        }
        // 获取最大值。
        List<TDKSetPos> list = posList.stream()
                .sorted((a, b) -> TDKSetPosOp.calcPosCountValue(a.getCardList(calcType), b.getCardList(calcType), a.getPosID(), b.getPosID(), set.getDai2Flag()) == b.getPosID() ? 1 : -1)
                .collect(Collectors.toList());
        TDKSetPos xPos = list.get(0);
        TDKSetPos yPos = list.get(1);

        int calcPos = TDKSetPosOp.calcPosCountValue(xPos.getCardList(calcType), yPos.getCardList(calcType), xPos.getPosID(), yPos.getPosID(), set.getDai2Flag());
        if (calcPos < 0) {
            // 不比花色：比牌时只比到牌值大小，不比牌的花色，在同一轮内，相同牌值的牌先拿到牌的比较大；
            int nextPos = -1;
            TDKSetPos nextSetPos = null;
            for (int i = 0; i < this.set.getPlayerNum(); i++) {
                nextPos = (i + this.set.getUpperRoundMaxPos()) % this.set.getPlayerNum();
                nextSetPos = this.nextSetPos(list, nextPos);
                if (null == nextSetPos) {
                    continue;
                }
                if (xPos.getPosID() == nextSetPos.getPosID()) {
                    return xPos.getPosID();
                }
                calcPos = TDKSetPosOp.calcPosCountValue(xPos.getCardList(calcType), nextSetPos.getCardList(calcType), xPos.getPosID(),
                        nextSetPos.getPosID(), set.getDai2Flag());
                if (calcPos < 0) {
                    return nextPos;
                }
            }
            return nextPos;
        } else {
            return calcPos;
        }
    }

    /**
     * 检查排序PosList
     *
     * @param list
     * @param nextPos
     * @return
     */
    private TDKSetPos nextSetPos(List<TDKSetPos> list, int nextPos) {
        return list.stream().filter(k -> k.getPosID() == nextPos).findAny().orElse(null);
    }


    /**
     * 计算下一个押注Pos
     *
     * @param posID 先发牌的优先下注PosID
     * @return
     */
    public int calcNextYaPos(int posID) {
        List<TDKSetPos> posList = this.set.posDict.values().stream().filter(k -> !k.isQiPai()).collect(Collectors.toList());
        int sizePos = posList.size();
        // 如果所有玩家都弃牌或者不存在。
        if (sizePos <= 0) {
            // 返回最后一个弃牌玩家。
            return posID;
        } else if (sizePos == 1) {
            // 如果一个玩家就一个玩家是大赢家。
            return posList.get(0).getPosID();
        }
        List<TDKSetPos> list = posList.stream()
                .sorted((a, b) -> TDKdefine.TDK_CARD_VALUE.valueOf(BasePocker.getCardValue(b.getIdxCard(1)), set.getDai2Flag()) - TDKdefine.TDK_CARD_VALUE.valueOf(BasePocker.getCardValue(a.getIdxCard(1)), set.getDai2Flag()))
                .collect(Collectors.toList());
        int xPosValue = TDKdefine.TDK_CARD_VALUE.valueOf(BasePocker.getCardValue(list.get(0).getIdxCard(1)), set.getDai2Flag());
        int yPosValue = TDKdefine.TDK_CARD_VALUE.valueOf(BasePocker.getCardValue(list.get(1).getIdxCard(1)), set.getDai2Flag());
        if (xPosValue == yPosValue) {
            int nextPos = -1;
            TDKSetPos nextSetPos = null;
            for (int i = 0; i < this.set.getPlayerNum(); i++) {
                nextPos = (i + this.set.getUpperRoundMaxPos()) % this.set.getPlayerNum();
                nextSetPos = this.nextSetPos(list, nextPos);
                if (null == nextSetPos) {
                    continue;
                }
                if (list.get(0).getPosID() == nextSetPos.getPosID()) {
                    return nextPos;
                }
                if (xPosValue == TDKdefine.TDK_CARD_VALUE.valueOf(BasePocker.getCardValue(nextSetPos.getIdxCard(1)), set.getDai2Flag())) {
                    return nextPos;
                }
            }
            return nextPos;
        } else {
            return list.get(0).getPosID();
        }
    }
}
